package org.scboy.dbms.valid.common;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.scboy.dbms.annotation.ValidType;
import org.scboy.dbms.entity.ParamConfig;
import org.scboy.dbms.valid.Valid;
import org.scboy.utils.entitys.coobi.Model;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;

@ValidType("数值校验")
public class ValueValid implements Valid {

	@Override
	public List<ParamConfig> config() {
		List<ParamConfig> ParamConfigs=new ArrayList<ParamConfig>();
		ParamConfigs.add(new ParamConfig("expression", "表达式","格式min-:最小限制,min-max:范围，-max最大限制"));
		return ParamConfigs;
	}

	@Override
	public boolean valid(Object data,Model model, Model config) {
		String expression=config.getString("expression");
		//为null或者表达式为空，跳过
		if(data!=null&&StrUtil.isNotEmpty(expression)){
			//判断是不是时间
			Date valeDate=Convert.toDate(data);
			if(valeDate!=null){
				String [] arrays=expression.split("-");
				Date min=Convert.toDate(arrays[0]);
				Date max=Convert.toDate(arrays[1]);
				if(min==null && max==null){
					return false;
				}
				//范围验证
				if(min!=null&& max!=null){
					if(valeDate.getTime()<min.getTime()|| valeDate.getTime()>max.getTime()){
						return false;
					}
				}
				//最小值限制
				if(min!=null){
					if(valeDate.getTime()<min.getTime()){
						return false;
					}
				}
				//最大值限制
				if(min!=null){
					if(valeDate.getTime()>max.getTime()){
						return false;
					}
				}
				return true;
			}
			//数值验证
			Double doubleValue=Convert.toDouble(data);
			if(doubleValue!=null){
				String [] arrays=expression.split("-");
				Double min=Convert.toDouble(arrays[0]);
				Double max=Convert.toDouble(arrays[1]);
				if(min==null && max==null){
					return false;
				}
				//范围验证
				if(min!=null&& max!=null){
					if(doubleValue<min|| doubleValue>max){
						return false;
					}
				}
				//最小值限制
				if(min!=null){
					if(doubleValue<min){
						return false;
					}
				}
				//最大值限制
				if(min!=null){
					if(doubleValue>max){
						return false;
					}
				}
				return true;
			}
		}
		return true;
	}

	@Override
	public String toString(Model config) {
		String expression=config.getString("expression");
		//验证范围
		String [] arrays=expression.split("-");
		String min=arrays[0];
		String max=arrays[1];
		//范围验证
		if(min!=null&& max!=null){
			return StrUtil.format("大小必须在{}-{}范围内", min,max);
		}
		//最小值限制
		if(min!=null){
			return StrUtil.format("最小", min);
		}
		//最大值限制
		return StrUtil.format("最大", max);
	}
	

}
